package com.qing.springbootorderservice.mq;

import com.alibaba.fastjson.JSONObject;
import com.qing.springbootorderservice.config.RabbitMQConfig;
import com.qing.springbootorderservice.pojo.Order;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;

@Service
public class OrderMQService {


	@Autowired
	private RabbitTemplate rabbitTemplate;

	@Autowired
	private JdbcTemplate jdbcTemplate;


	//@PostConstruct注解好多人以为是Spring提供的，其实是java自己的注解
	//Java中该注解的说明： 该注解被用来修饰一个非静态的void（）方法，被修饰的方法会在服务器加载Servlet的时候运行
	//并且只会被服务器质性一次，PostConstruct在构造函数之后执行，init（）方法之前执行
	@PostConstruct
	public void regCallback(){
		//消息发送成功后，给予生产者的消息回执，来确保生产者的可靠性
		rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
			@Override
			public void confirm(CorrelationData correlationData, boolean ack, String cause) {
				System.out.println("cause:"+cause);
				//如果ack为true代表消息已经收到
				String orderId=correlationData.getId();
				if(!ack){
					//这里可能要进行其他的方式进行存储
					System.out.println("MQ 队列应答失败，orderId是："+orderId);
					return;
				}
				try {
					String updateSql="update dispatcher_order_message set status=1 where order_id=?";
					int count=jdbcTemplate.update(updateSql,orderId);
					if(count==1){
						System.out.println("本地消息状态修改成功，消息成功投递到消息队列中。。。");
					}
				}catch (Exception ex){
					System.out.println("本地消息状态修改失败，出现异常："+ex.getMessage());
				}
			}
		});
	}


	public void sendMessage(Order order){
		rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"", JSONObject.toJSON(order).toString(),new CorrelationData(order.getOrderId()));
	}

}
